package com.zyl.lock8;

import java.util.concurrent.TimeUnit;

/**
 * @author zhaoyl
 * @date 2024/5/15 16:30
 * @description 说明
 * 锁问题：普通方法不受锁影响，正常执行,会优先执行
 *------------
 * 线程A发送短信  （A先抢占资源先执行）
 * 线程C普通方法执行 （B睡5秒）
 * 线程B打电话      （B普通方法不受锁影响）
 * -------------
 * synchronized修饰实例方法，会给实例对象加锁
 *
 * synchronized修饰静态方法，会给类加锁
 * synchronized代码块，锁住的是括号内的对象/类
 *
 */
public class Test2 {

    public static void main(String[] args) {
        //new两个对象,两把锁
        Phone2 phone1 = new Phone2();
        Phone2 phone2 = new Phone2();

        //线程A打电话
        new Thread(()->{
            phone1.sendSms();//对象1
        },"线程A").start();
        try {
            TimeUnit.SECONDS.sleep(1);//睡2秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //线程B发短信
        new Thread(()->{
            phone2.call();////对象2
        },"线程B").start();

        //线程C普通方法
        new Thread(()->{
            phone2.hello();////对象2
        },"线程C").start();

    }
}
class  Phone2 {
    //synchronized锁的是方法的调用者Phone(实力对象)
    //两个对象用的是同一个锁，谁先拿到谁先执行
    //同步锁
    public synchronized void sendSms(){
        System.out.println(Thread.currentThread().getName()+"发送短信");
    }
    //同步锁;
    public synchronized void call(){
        try {
            TimeUnit.SECONDS.sleep(5);//睡5秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"打电话");
    }
    //没有锁
    public void hello(){
        System.out.println(Thread.currentThread().getName()+"普通方法执行");
    }
}
